home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Franz PD
/
Franz PD Disk #324 (1994-04)(Rhein-Sieg-Soft).zip
/
Franz PD Disk #324 (1994-04)(Rhein-Sieg-Soft).adf
/
VideoText3.5
/
source
/
startup.p
< prev
next >
Wrap
Text File
|
1994-04-01
|
6KB
|
194 lines
UNIT startup; {$project vt }
{ Wertet die Programmstartargumente für VideoText aus }
INTERFACE; FROM vt USES global,jobs,datei,i2c_serial;
PROCEDURE get_args;
{ ---------------------------------------------------------------------- }
IMPLEMENTATION;
{$opt b-}
{$incl "workbench/startup.h", "icon.lib", "dos.lib" }
FUNCTION value(s: Str80): Long;
{ kann Hex- und Dezimalzahlen dekodieren (Hex muß mit "$" anfangen) }
{ Sehr primitive Version: Vorzeichen wird nicht berücksichtigt }
VAR i: Integer;
x: Long;
BEGIN
i := 1; x := 0;
WHILE s[i]=' ' DO Inc(i);
IF s[i]='$' THEN BEGIN
Inc(i);
WHILE s[i] IN ['0'..'9','A'..'F','a'..'f'] DO BEGIN
x := x SHL 4 + ord(s[i]);
CASE s[i] OF
'0'..'9': x := x - ord('0');
'A'..'F': x := x - ord('A') + 10;
'a'..'f': x := x - ord('a') + 10;
END;
Inc(i);
END;
END ELSE
WHILE s[i] IN ['0'..'9'] DO BEGIN
x := x*10 + ord(s[i]) - ord('0');
Inc(i);
END;
value := x;
END;
FUNCTION getpages(filename: Str80): Integer;
{ Alle VT-Seiten aus einer VTPG-Datei einlesen und in die Seitenliste }
{ einreihen. Rückgabewert: Anzahl der gelesenen Seiten }
VAR i, gelesen: Integer;
bytes: ^ARRAY[1..41] OF Char;
datei: Text;
zeile: Str80;
seite: p_onepage;
BEGIN
gelesen := 0;
Reset(datei,filename);
IF (IOresult<>0) THEN { Datei existiert nicht }
Exit;
WHILE NOT EoF(datei) DO BEGIN
REPEAT
ReadLn(datei,zeile);
UNTIL (zeile='VTPG') OR EoF(datei);
if zeile='VTPG' THEN BEGIN
New(seite);
FOR i := 0 to 23 DO BEGIN
bytes := Ptr(^seite^.chars[40*i]);
BlockRead(datei,bytes^,40);
ReadLn(datei);
END;
Read(datei,seite^.pg,seite^.sp); ReadLn(datei,zeile);
seite^.cbits := value(zeile);
ins_to_list(seite); Inc(gelesen);
END;
END;
Close(datei);
getpages := gelesen;
END;
PROCEDURE get_args;
{ wertet CLI- oder WorkBench-Argumente aus }
{ ToolTypes: CLI-Parameter: }
{ FILE=<output name> -f=<output name> }
{ MAXWAIT=<seconds> -w<seconds> }
{ BUSDELAY=<counter> -d<counter> }
{ BURST=<tics> -b<tics> }
{ SHUFFLE=<tics> -s<tics> }
{ <page> <page> ... }
{ <file> <file> ... }
var s: bigstring;
len,i,j,k,ok,gelesen: integer;
name: str80;
is_job: Boolean;
hail: p_WBStartup;
arg: p_WBArg;
olddir: BPTR;
icon: p_DiskObject;
entry: Str;
FUNCTION is_space(ch: Char): Boolean;
BEGIN is_space := (ch=' ') OR (ch=#9) OR (ch=#10) OR (ch=#13); END;
BEGIN
outputname := 'RAM:VTdatei'; { default-Ausgabedatei }
queued := 0;
maxwait := 60;
busdelay := 0;
burst := 0;
shuffle := 20;
gelesen := 0;
IF fromWB THEN BEGIN
OpenLib(IconBase,'icon.library',0);
hail := StartupMessage;
arg := hail^.sm_ArgList;
FOR i := 1 to hail^.sm_NumArgs DO BEGIN
olddir := CurrentDir(arg^.wa_Lock);
name := arg^.wa_Name;
IF i=1 THEN BEGIN { 1. Datei: das Programm selbst, ToolTypes checken }
icon := GetDiskObject(name);
IF icon<>Nil THEN BEGIN
entry := FindToolType(icon^.do_ToolTypes, 'FILE');
if ptr(entry)<>Nil then
outputname := entry;
entry := FindToolType(icon^.do_ToolTypes, 'MAXWAIT');
if ptr(entry)<>Nil then
Val(entry,maxwait,ok);
entry := FindToolType(icon^.do_ToolTypes, 'BUSDELAY');
if ptr(entry)<>Nil then
Val(entry,busdelay,ok);
entry := FindToolType(icon^.do_ToolTypes, 'BURST');
if ptr(entry)<>Nil then
Val(entry,burst,ok);
entry := FindToolType(icon^.do_ToolTypes, 'SHUFFLE');
if ptr(entry)<>Nil then
Val(entry,shuffle,ok);
FreeDiskObject(icon);
END;
END ELSE { zusätzliche Dateien: enthalten Seiten, einlesen }
IF filetype(name)=1 THEN
gelesen := gelesen + getpages(name);
olddir := CurrentDir(olddir);
{ auf nächsten WBArg-Zeiger zugreifen: }
arg := Ptr(Long(arg)+SizeOf(WBArg));
END;
CloseLib(IconBase);
end else if ParameterLen>0 then begin
s := copy(ParameterStr,1,ParameterLen);
len := length(s);
{ Parameterzeile in Worte zerlegen, wie der argv[] in C es schon ist :-( }
i := 1; while i<=len do begin
while is_space(s[i]) do Inc(i);
j := i + 1;
if s[i]='"' then begin
Inc(i); while (s[j]<>'"') AND (j<=len) do Inc(j);
end else begin
while NOT is_space(s[j]) AND (j<=len) do Inc(j);
end;
{ Zeiger i: 1. Zeichen des Wortes, j: 1. Trennzeichen dahinter }
if s[i]='-' then begin
i := i+2;
case s[i-1] of
'f': begin
if s[i] = '=' then Inc(i);
if j>i then
outputname := copy(s,i,j-i);
end;
'd': Val(copy(s,i,j-i),busdelay,ok);
'w': Val(copy(s,i,j-i),maxwait,ok);
'b': Val(copy(s,i,j-i),burst,ok);
's': Val(copy(s,i,j-i),shuffle,ok);
otherwise begin
writeln('usage:');
writeln('VideoText <pages> <files> -f=<name> -d<loops> -w<secs> -b<tics> -s<tics>');
writeln('-f: OUTPUT file, -d: slow down I²C-bus, -w: max. wait for pages to arrive');
writeln('transmission time per page ... -b: in burst mode, -s: in shuffle mode');
writeln('e. g.: VideoText 112 113 114 115 -f=RAM:VTdatei -d0 -w60 -b0 -s20');
end;
end;
END ELSE BEGIN
{ Was nur aus '0123456789/' besteht, ist eine Seitennummer, alles andere eine }
{ Eingabedatei. }
is_job := True;
FOR k := i TO j-1 DO
IF NOT (s[k] IN ['0'..'9','/']) THEN is_job := False;
IF is_job THEN
add_job(copy(s,i,j-i))
ELSE IF filetype(Copy(s,i,j-i))=1 THEN
gelesen := gelesen + getpages(Copy(s,i,j-i));
END;
i := j + 1;
END;
END;
IF (queued=0) AND (gelesen=0) THEN BEGIN
queued := 1;
queue[1].pg := 100; queue[1].sp := 0;
END;
END;
BEGIN { Initialisierung }
END.